home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / xwindows / demos / xfract_1.z / xfract_1 / xfractint-1.06 / miscres.c < prev    next >
C/C++ Source or Header  |  1992-09-28  |  24KB  |  907 lines

  1. /*
  2.     Resident odds and ends that don't fit anywhere else.
  3. */
  4.  
  5. #include <string.h>
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8. #include <ctype.h>
  9. #include <time.h>
  10. #ifndef XFRACT
  11. #include <stdarg.h>
  12. #include <io.h>
  13. #else
  14. #include <varargs.h>
  15. #endif
  16. #include <math.h>
  17. #ifdef __TURBOC__
  18. #include <dir.h>
  19. #endif
  20. #include "fractint.h"
  21. #include "fractype.h"
  22. #include "helpdefs.h"
  23. #include "prototyp.h"
  24.  
  25. /* routines in this module    */
  26.  
  27. #ifndef XFRACT
  28. extern    int timer(int timertype,int(*subrtn)(),...);
  29. #else
  30. extern  int timer();
  31. #endif
  32.  
  33. static    void trigdetails(char *);
  34.  
  35. int active_ovly = -1;
  36. long timer_start,timer_interval;    /* timer(...) start & total */
  37.  
  38. extern char IFSFileName[80];
  39. extern char IFSName[40];
  40. extern float far *ifs_defn;
  41. extern int  ifs_changed;
  42. extern int  ifs_type;
  43.  
  44. extern char temp[], temp1[256];   /* temporary strings          */
  45.  
  46. extern int  active_ovly;
  47. extern int  xdots, ydots;
  48. extern int  dotmode;
  49. extern int  show_orbit;
  50. extern int  timerflag;
  51. extern int  debugflag;
  52. extern int  maxit;
  53. extern int  fractype;
  54. extern int  got_status,curpass,totpasses,currow,curcol;
  55. extern int  fileydots;
  56. extern int  xxstart,xxstop,yystart,yystop;
  57. extern int  display3d;
  58. extern char overwrite;
  59.  
  60.  
  61. /* TW's static string consolidation campaign to help brain-dead compilers */
  62. char s_cantopen[]       = {"Can't open %s"};
  63. char s_cantwrite[]      = {"Can't write %s"};
  64. char s_cantcreate[]     = {"Can't create %s"};
  65. char s_cantunderstand[] = {"Can't understand %s"};
  66. char s_cantfind[]       = {"Can't find %s"};
  67.  
  68. /* call next when returning from resident routine and unsure whether
  69.    caller is an overlay which has been displaced */
  70. void restore_active_ovly()
  71. {
  72.    switch (active_ovly) {
  73.       case OVLY_MISCOVL:  miscovl_overlay();  break;
  74.       case OVLY_CMDFILES: cmdfiles_overlay(); break;
  75.       case OVLY_HELP:      help_overlay();     break;
  76.       case OVLY_PROMPTS:  prompts_overlay();  break;
  77.       case OVLY_LOADFILE: loadfile_overlay(); break;
  78.       case OVLY_ROTATE:   rotate_overlay();   break;
  79.       case OVLY_PRINTER:  printer_overlay();  break;
  80.       case OVLY_LINE3D:   line3d_overlay();   break;
  81.       case OVLY_ENCODER:  encoder_overlay();  break;
  82.       case OVLY_CALCFRAC: calcfrac_overlay(); break;
  83.       case OVLY_INTRO:      intro_overlay();    break;
  84.       }
  85. }
  86.  
  87.  
  88. #ifndef XFRACT
  89. void findpath(char *filename, char *fullpathname) /* return full pathnames */
  90. {
  91.    if (filename[0] == SLASHC
  92.      || (filename[0] && filename[1] == ':')) {
  93.       strcpy(fullpathname,filename);
  94.       return;
  95.       }
  96.    fullpathname[0] = 0;             /* indicate none found */
  97. #ifdef __TURBOC__                /* look for the file */
  98.    strcpy(fullpathname,searchpath(filename));
  99. #else
  100.    _searchenv(filename,"PATH",fullpathname);
  101. #endif
  102.    if (fullpathname[0] != 0)            /* found it! */
  103.       if (strncmp(&fullpathname[2],SLASHSLASH,2) == 0) /* stupid klooge! */
  104.      strcpy(&fullpathname[3],filename);
  105. }
  106. #endif
  107.  
  108.  
  109. void notdiskmsg()
  110. {
  111. static char far sorrymsg[]={
  112. "I'm sorry, but because of its random-screen-access algorithms, this\n\
  113. type cannot be created using a real-disk based 'video' mode."};
  114.    stopmsg(1,sorrymsg);
  115. }
  116.  
  117.  
  118. /* convert corners to center/mag */
  119. int cvtcentermag(double *Xctr, double *Yctr, double *Magnification)
  120. {
  121.    extern double xxmax,xxmin,yymax,yymin,xx3rd,yy3rd;
  122.    double Width, Height, Radius, Ratio;
  123.    Width  = xxmax - xxmin;
  124.    Height = yymax - yymin;
  125.    Ratio = Height / Width;
  126.    if(xx3rd != xxmin || yy3rd != yymin || Width < 0
  127.      || (Width > 1e-8 && (Ratio <= 0.74 || Ratio >= 0.76))
  128.      || Ratio < 0.66 || Ratio > 0.84)
  129.       return(0);
  130.    /* calculate center and magnification */
  131.    Radius = Height / 2.0;
  132.    *Xctr = xxmin + (Width / 2.0);
  133.    *Yctr = yymin + Radius;
  134.    *Magnification = 1.0 / Radius;
  135.    return(1);
  136. }
  137.  
  138.  
  139. void updatesavename(char *filename) /* go to the next file name */
  140. {
  141.    char *save, *hold;
  142.    char name[80],suffix[80];
  143.    char *dotptr;
  144.  
  145.    strcpy(name,filename);
  146.    suffix[0] = 0;
  147.    if ((dotptr = strrchr(name,'.')) != NULL
  148.      && dotptr > strrchr(name,SLASHC)) {
  149.       strcpy(suffix,dotptr);
  150.       *dotptr = 0;
  151.       }
  152.  
  153.    hold = name + strlen(name) - 1; /* start at the end */
  154.    while(hold >= name && (*hold == ' ' || isdigit(*hold))) /* skip backwards */
  155.       hold--;
  156.    hold++;            /* recover first digit */
  157.    while (*hold == '0')         /* skip leading zeros */
  158.       hold++;
  159.    save = hold;
  160.    while (*save) {        /* check for all nines */
  161.       if (*save != '9')
  162.      break;
  163.       save++;
  164.       }
  165.    if (!*save)            /* if the whole thing is nines then back */
  166.       save = hold - 1;        /* up one place. Note that this will eat */
  167.                 /* your last letter if you go to far.     */
  168.    else
  169.       save = hold;
  170.    sprintf(save,"%d",atoi(hold)+1); /* increment the number */
  171.    strcpy(filename,name);
  172.    strcat(filename,suffix);
  173. }
  174.  
  175. int check_writefile(char *name,char *ext)
  176. {
  177.  /* after v16 release, change encoder.c to also use this routine */
  178.    char openfile[80];
  179.    char opentype[20];
  180.    int i;
  181. nextname:
  182.    strcpy(openfile,name);
  183.    strcpy(opentype,ext);
  184.    for (i = 0; i < strlen(openfile); i++)
  185.       if (openfile[i] == '.') {
  186.      strcpy(opentype,&openfile[i]);
  187.      openfile[i] = 0;
  188.      }
  189.    strcat(openfile,opentype);
  190.    if (access(openfile,0) != 0) /* file doesn't exist */
  191.    {
  192.       strcpy(name,openfile);
  193.       return 0;
  194.     }
  195.    /* file already exists */
  196.    if (overwrite == 0) {
  197.       updatesavename(name);
  198.       goto nextname;
  199.       }
  200.    return 1;
  201. }
  202.  
  203.  
  204. int check_key()
  205. {
  206.    int key;
  207.    if((key = keypressed()) != 0) {
  208.       if(key != 'o' && key != 'O') {
  209.      fflush(stdout);
  210.      return(-1);
  211.       }
  212.       getakey();
  213.       if (dotmode != 11)
  214.      show_orbit = 1 - show_orbit;
  215.    }
  216.    return(0);
  217. }
  218.  
  219.  
  220. /* timer function:
  221.      timer(0,(*fractal)())        fractal engine
  222.      timer(1,NULL,int width)        decoder
  223.      timer(2)                encoder
  224.   */
  225. #ifndef XFRACT
  226. int timer(int timertype,int(*subrtn)(),...)
  227. #else
  228. int timer(va_alist)
  229. va_dcl
  230. #endif
  231. {
  232.    va_list arg_marker;    /* variable arg list */
  233.    char *timestring;
  234.    time_t ltime;
  235.    FILE *fp;
  236.    int out;
  237.    int i;
  238.    int do_bench;
  239.  
  240. #ifndef XFRACT
  241.    va_start(arg_marker,subrtn);
  242. #else
  243.    int timertype;
  244.    int (*subrtn)();
  245.    va_start(arg_marker);
  246.    timertype = va_arg(arg_marker, int);
  247.    subrtn = ( int (*)()) va_arg(arg_marker, int);
  248. #endif
  249.  
  250.    do_bench = timerflag; /* record time? */
  251.    if (timertype == 2)     /* encoder, record time only if debug=200 */
  252.       do_bench = (debugflag == 200);
  253.    if(do_bench)
  254.       fp=fopen("bench","a");
  255.    timer_start = clock_ticks();
  256.    switch(timertype) {
  257.       case 0:
  258.      out = (*subrtn)();
  259.      break;
  260.       case 1:
  261.      i = va_arg(arg_marker,int);
  262.      out = decoder(i);         /* not indirect, safer with overlays */
  263.      break;
  264.       case 2:
  265.      out = encoder();         /* not indirect, safer with overlays */
  266.      break;
  267.       }
  268.    /* next assumes CLK_TCK is 10^n, n>=2 */
  269.    timer_interval = (clock_ticks() - timer_start) / (CLK_TCK/100);
  270.  
  271.    if(do_bench) {
  272.       time(<ime);
  273.       timestring = ctime(<ime);
  274.       timestring[24] = 0; /*clobber newline in time string */
  275.       switch(timertype) {
  276.      case 1:
  277.         fprintf(fp,"decode ");
  278.         break;
  279.      case 2:
  280.         fprintf(fp,"encode ");
  281.         break;
  282.      }
  283.       fprintf(fp,"%s type=%s resolution = %dx%d maxiter=%d",
  284.       timestring,
  285.       curfractalspecific->name,
  286.       xdots,
  287.       ydots,
  288.       maxit);
  289.       fprintf(fp," time= %ld.%02ld secs\n",timer_interval/100,timer_interval%100);
  290.       if(fp != NULL)
  291.      fclose(fp);
  292.       }
  293.    return(out);
  294. }
  295.  
  296.  
  297. BYTE trigndx[] = {SIN,SQR,SINH,COSH};
  298. #ifndef XFRACT
  299. void (*ltrig0)() = lStkSin;
  300. void (*ltrig1)() = lStkSqr;
  301. void (*ltrig2)() = lStkSinh;
  302. void (*ltrig3)() = lStkCosh;
  303. void (*mtrig0)() = mStkSin;
  304. void (*mtrig1)() = mStkSqr;
  305. void (*mtrig2)() = mStkSinh;
  306. void (*mtrig3)() = mStkCosh;
  307. #endif
  308. void (*dtrig0)() = dStkSin;
  309. void (*dtrig1)() = dStkSqr;
  310. void (*dtrig2)() = dStkSinh;
  311. void (*dtrig3)() = dStkCosh;
  312.  
  313. struct trig_funct_lst trigfn[] =
  314. /* changing the order of these alters meaning of *.fra file */
  315. /* maximum 6 characters in function names or recheck all related code */
  316. {
  317. #ifndef XFRACT
  318.    {"sin",   lStkSin,   dStkSin,   mStkSin   },
  319.    {"cosxx", lStkCosXX, dStkCosXX, mStkCosXX },
  320.    {"sinh",  lStkSinh,  dStkSinh,  mStkSinh  },
  321.    {"cosh",  lStkCosh,  dStkCosh,  mStkCosh  },
  322.    {"exp",   lStkExp,   dStkExp,   mStkExp   },
  323.    {"